import axios from 'axios'
import { showToast } from 'vant'
import { useUserStore } from '@/stores/user'
import router from '@/router'

// 创建axios实例
const service = axios.create({
  baseURL: import.meta.env.VITE_API_URL || '/api',
  timeout: 10000
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    const userStore = useUserStore()
    if (userStore.token) {
      config.headers['Authorization'] = `Bearer ${userStore.token}`
    }
    return config
  },
  error => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 如果响应类型是blob，直接返回响应
    if (response.config.responseType === 'blob') {
      return response
    }
    
    const res = response.data
    if (res.code !== 200) {
      showToast(res.message || '操作失败')
      
      // 如果是token相关错误，清除用户信息并跳转到登录页
      if ([401, 403].includes(res.code)) {
        const userStore = useUserStore()
        userStore.setToken('')
        userStore.setUserInfo(null)
        router.push('/login')
      }
      
      return Promise.reject(new Error(res.message || '操作失败'))
    }
    return res
  },
  error => {
    // 如果是blob类型的请求失败，需要解析错误信息
    if (error.response?.config?.responseType === 'blob') {
      return new Promise((resolve, reject) => {
        const reader = new FileReader()
        reader.onload = () => {
          try {
            const errorData = JSON.parse(reader.result)
            showToast(errorData.message || '导出失败')
          } catch (e) {
            showToast('导出失败')
          }
          reject(error)
        }
        reader.onerror = () => {
          showToast('导出失败')
          reject(error)
        }
        reader.readAsText(error.response.data)
      })
    }
    
    console.error('响应错误:', error)
    
    // 处理 401 未授权错误
    if (error.response?.status === 401) {
      const userStore = useUserStore()
      userStore.setToken('')
      userStore.setUserInfo(null)
      router.push('/login')
      showToast('登录已过期，请重新登录')
    } else {
      showToast(error.message || '网络错误')
    }
    
    return Promise.reject(error)
  }
)

export default service 